package co.baiku.boot.pay.v3.callback;

import co.baiku.boot.v3.model.WeixinPayScoreCallbackResource;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.io.Serializable;

/**
 * <h2>回调通知</h2>
 * <div class="part">
 *  <h3>通知规则</h3>
 * 	<p>用户确认完成后，微信后台会把相关确认结果和订单信息发送给商户，商户需要接收处理该消息，并返回应答。</p>
 *  <p>对后台通知交互时，如果微信收到商户的应答不符合规范或超时，微信认为通知失败，微信会通过一定的策略定期重新发起通知，尽可能提高通知的成功率，但微信不保证通知最终能成功。 （通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m）</p>
 * </div>
 * <div class="part">
 * <h3>通知报文</h3>
 * <p>用户确认结果通知是以POST 方法访问商户设置的通知url，通知的数据以JSON 格式通过请求主体（BODY）传输。通知的数据包括了加密的支付结果详情。</p><br>
 * <p>下面详细描述对通知数据进行解密的流程：</p>
 *   <ol>
 * 	   <li>1、用商户平台上设置的APIv3密钥【<a href="https://pay.weixin.qq.com" target="_blank">微信商户平台</a>—&gt;账户设置—&gt;API安全—&gt;设置APIv3密钥】，记为key。</li>
 * 	   <li>2、针对resource.algorithm中描述的算法（目前为AEAD_AES_256_GCM），取得对应的参数nonce和associated_data。</li>
 * 	   <li>3、使用key、nonce和associated_data，对数据密文resource.ciphertext进行解密，得到JSON形式的资源对象。</li>
 * 	 </ol>
 * <p><strong>注：</strong> AEAD_AES_256_GCM算法的接口细节，请参考<a href="https://tools.ietf.org/html/rfc5116">rfc5116</a>。微信支付使用的密钥key长度为32个字节，随机串nonce长度12个字节，associated_data长度小于16个字节并可能为空。</p>
 * </div>
 *
 * @see <a href='https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/payscore/chapter5_2.shtml'>官方文档</a>
 */
@JsonIgnoreProperties(ignoreUnknown = true)
public class WeixinPayScoreCallback<T> implements Serializable {
    /**
     * 通知ID
     * <pre>
     * 通知的唯一ID。
     * 示例值：EV-2018022511223320873
     * </pre>
     */
    private String id;
    /**
     * 通知创建时间
     * <pre>
     * 通知创建的时间，格式为 yyyy-MM-ddTHH:mm:ss+08:00(标准iso8601时间格式）。
     * 示例值：20180225112233
     * </pre>
     */
    @JsonProperty("create_time")
    private String createTime;
    /**
     * 通知类型
     * <pre>
     * 通知的类型
     * 1、授权成功通知的类型为PAYSCORE.USER_OPEN_SERVICE
     * 2、解除授权成功通知的类型为PAYSCORE.USER_CLOSE_SERVICE
     * 3、用户确认成功通知的类型为PAYSCORE.USER_CONFIRM
     * 4、支付成功通知的类型为PAYSCORE.USER_PAID
     * 示例值：PAYSCORE.USER_OPEN_SERVICE
     * </pre>
     */
    @JsonProperty("event_type")
    private String eventType;
    /**
     * 摘要信息(提示信息,示例:微信支付分服务订单用户已确认)
     */
    private String summary;

    /**
     * 通知数据类型
     * <pre>
     * 通知的资源数据类型，授权/解除授权成功通知为encryptresource。
     * 示例值：encrypt-resource
     * </pre>
     */
    @JsonProperty("resource_type")
    private String resourceType;
    /**
     * 回调数据
     */
    private WeixinPayScoreCallbackResource<T> resource;

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }
    public String getEventType() {
        return eventType;
    }

    public void setEventType(String eventType) {
        this.eventType = eventType;
    }

    public String getResourceType() {
        return resourceType;
    }

    public void setResourceType(String resourceType) {
        this.resourceType = resourceType;
    }

    public WeixinPayScoreCallbackResource getResource() {
        return resource;
    }

    public void setResource(WeixinPayScoreCallbackResource resource) {
        this.resource = resource;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getSummary() {
        return summary;
    }

    public void setSummary(String summary) {
        this.summary = summary;
    }
}
